From 49fa33098b76eaaabf3579eb01b29fe84dc96d38 Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Mon, 20 Feb 2006 17:34:21 +0000 Subject: [PATCH] Fix read_cr3() and use it. From: Jan Beulich Signed-off-by: Christian Limpach --- linux-2.6-xen-sparse/arch/x86_64/mm/fault-xen.c | 9 ++------- .../include/asm-x86_64/mach-xen/asm/system.h | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/x86_64/mm/fault-xen.c b/linux-2.6-xen-sparse/arch/x86_64/mm/fault-xen.c index 5465e26d1c..dfd2f2df0f 100644 --- a/linux-2.6-xen-sparse/arch/x86_64/mm/fault-xen.c +++ b/linux-2.6-xen-sparse/arch/x86_64/mm/fault-xen.c @@ -152,10 +152,7 @@ void dump_pagetable(unsigned long address) pmd_t *pmd; pte_t *pte; - asm("movq %%cr3,%0" : "=r" (pgd)); - pgd = (pgd_t *)machine_to_phys((maddr_t)pgd); - - pgd = __va((unsigned long)pgd & PHYSICAL_PAGE_MASK); + pgd = __va(read_cr3() & PHYSICAL_PAGE_MASK); pgd += pgd_index(address); if (bad_address(pgd)) goto bad; printk("PGD %lx ", pgd_val(*pgd)); @@ -261,9 +258,7 @@ static int vmalloc_fault(unsigned long address) /* On Xen the line below does not always work. Needs investigating! */ /*pgd = pgd_offset(current->mm ?: &init_mm, address);*/ - asm("movq %%cr3,%0" : "=r" (pgd)); - pgd = (pgd_t *)machine_to_phys((maddr_t)pgd); - pgd = __va((unsigned long)pgd & PHYSICAL_PAGE_MASK); + pgd = __va(read_cr3() & PHYSICAL_PAGE_MASK); pgd += pgd_index(address); pgd_ref = pgd_offset_k(address); if (pgd_none(*pgd_ref)) diff --git a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/system.h b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/system.h index 9010441554..bde56ce43c 100644 --- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/system.h +++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/system.h @@ -182,7 +182,7 @@ static inline void write_cr0(unsigned long val) #define read_cr3() ({ \ unsigned long __dummy; \ asm("movq %%cr3,%0" : "=r" (__dummy)); \ - return machine_to_phys(__dummy); \ + machine_to_phys(__dummy); \ }) static inline unsigned long read_cr4(void) -- 2.30.2